home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 076-100 / 093 / microemacs / source / src.arc / tipc.c < prev    next >
C/C++ Source or Header  |  1987-08-16  |  8KB  |  282 lines

  1.  /*
  2.  * The routines in this file provide support for the TI-PC and other
  3.  * compatible terminals. It goes directly to the alpha-numeric RAM to do
  4.  * screen output. It compiles into nothing if not a TI-PC driver.
  5.  * This is not the TIPC.C file Dan distributed but it did not work due to
  6.  * lack of current updates.  It also used all DSR calls.  This version
  7.  * does directly write to screen ram in most cases.  It has only been
  8.  * tested under Lattice 3.1 at this time though.  ( BIX id ronlepine   */
  9.  
  10. #define termdef 1                       /* don't define "term" external */
  11.  
  12. #include        <stdio.h>
  13. #include        "estruct.h"
  14. #include        "edef.h"
  15.  
  16. #if     TIPC
  17.  
  18. #define NROW    25                      /* Screen size.                 */
  19. #define NCOL    80                      /* Edit if you want to.         */
  20. #define MARGIN  8                       /* size of minimim margin and   */
  21. #define SCRSIZ  64                      /* scroll size for extended lines */
  22. #define NPAUSE  200                     /* # times thru update to pause */
  23. #define BEL     0x07                    /* BEL character.               */
  24. #define ESC     0x1B                    /* ESC character.               */
  25. #define SPACE   32                      /* space character              */
  26. #define SCADD   0xDE000000L             /* address of screen RAM        */
  27. #define ATTRADD 0xDE001800L        /* Address for attribute latch    */
  28. #define CHAR_ENABLE     0x08            /* TI attribute to show char    */
  29. #define TI_REVERSE      0x10            /* TI attribute to reverse char */
  30. #define BLACK   0+CHAR_ENABLE           /* TI attribute for Black       */
  31. #define BLUE    1+CHAR_ENABLE           /* TI attribute for Blue        */
  32. #define RED     2+CHAR_ENABLE           /* TI attribute for Red         */
  33. #define MAGENTA 3+CHAR_ENABLE           /* TI attribute for Magenta     */
  34. #define GREEN   4+CHAR_ENABLE           /* TI attribute for Green       */
  35. #define CYAN    5+CHAR_ENABLE           /* TI attribute for Cyan        */
  36. #define YELLOW  6+CHAR_ENABLE           /* TI attribute for Yellow      */
  37. #define WHITE   7+CHAR_ENABLE           /* TI attribute for White       */
  38.  
  39. extern  int     ttopen();               /* Forward references.          */
  40. extern  int     ttgetc();
  41. extern  int     ttputc();
  42. extern  int     ttflush();
  43. extern  int     ttclose();
  44. extern  int     timove();
  45. extern  int     tieeol();
  46. extern  int     tieeop();
  47. extern  int     tibeep();
  48. extern  int     tiopen();
  49. extern  int     tikopen();
  50. extern  int     tikclose();
  51. extern  int     tirev();
  52. extern  int     ticres();
  53. extern  int     ticlose();
  54. extern  int     tiputc();
  55. extern  int     tifcol();
  56. extern  int     tibcol();
  57. extern  int     tiwrattr();
  58. extern     union     REGS rg;        /* cpu register for use of DOS calls */
  59.  
  60.  
  61. int     cfcolor = -1;           /* current forground color    */
  62. int     cbcolor = -1;           /* current background color    */
  63. int     ctrans[] =              /* ansi to ti color translation table */
  64.         {BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE};
  65.  
  66. long    scadd = SCADD;        /* address of screen ram    */
  67. long    attradd = ATTRADD;    /* address of attribute latch    */
  68. int    *scptr[NROW];        /* pointer to screen lines    */
  69. char    sline[NCOL];        /* screen line image        */
  70.  
  71.  
  72. /*
  73.  * Standard terminal interface dispatch table. Most of the fields point into
  74.  * "termio" code.
  75.  */
  76. TERM    term    = {
  77.         NROW-1,
  78.         NROW-1,
  79.         NCOL,
  80.         NCOL,
  81.         MARGIN,
  82.         SCRSIZ,
  83.         NPAUSE,
  84.         tiopen,
  85.         ticlose,
  86.         tikopen,
  87.         tikclose,
  88.         ttgetc,
  89.         tiputc,
  90.         ttflush,
  91.         timove,
  92.         tieeol,
  93.         tieeop,
  94.         tibeep,
  95.         tirev,
  96.         ticres,
  97.         tifcol,
  98.         tibcol
  99. };
  100.  
  101.  
  102. tifcol(color)           /* set the current output color */
  103.  
  104. int color;      /* color to set. Actually only used for line 25 */
  105.  
  106.     cfcolor = ctrans[color];
  107.     memset(attradd, cfcolor, 1);
  108. }
  109.  
  110. tibcol(color)    /* set current background color. Not used. Background is */
  111.         /* graphics function on TI  */
  112. int color;    /* color to set */
  113.  
  114. {
  115.        /* not used in memmap driver */  
  116. }
  117.        
  118. timove(row, col)
  119. {
  120.         rg.h.ah = 2;            /* set cursor position function code */
  121.         rg.h.dh = col;
  122.         rg.h.dl = row;
  123.         int86(0x49, &rg, &rg);
  124. }
  125.  
  126. tieeol()        /* erase to the end of the line */
  127.  
  128. {
  129.         int ccol;           /* current column cursor lives */
  130.         int crow;           /* current row cursor lives */
  131.     char        *lnptr;    /* pointer to the destination line */
  132.     char        i;    
  133.  
  134.         /* find the current cursor position */
  135.         rg.h.ah = 3;            /* read cursor position function code */
  136.         int86(0x49, &rg, &rg);
  137.         ccol = rg.h.dh;         /* record current column */
  138.         crow = rg.h.dl;         /* and row */
  139.  
  140.     lnptr = &sline[0];
  141.     for (i=0; i < term.t_ncol; i++)
  142.         *lnptr++ = SPACE;
  143.         /* and send the string out */
  144.     movmem(&sline[0], scptr[crow]+ccol, term.t_ncol-ccol);
  145.  
  146. }
  147.  
  148. tiputc(ch)      /* put a character at the current position in the
  149.                    current colors */
  150.  
  151. int ch;
  152.  
  153. {
  154.         rg.h.ah = 0x0E;         /* write char to screen with current attrs */
  155.         rg.h.al = ch;
  156.         int86(0x49, &rg, &rg);
  157. }
  158.  
  159. tieeop()                        /* Clear Text Screen and Home Cursor     */
  160. {                /* This also sets logical col 1, row 1   */
  161.     rg.h.ah = 0x13;         /* to physical col 1, row 1.  Avoid hard-*/
  162.     int86(0x49, &rg, &rg);  /* ware scroll which will change the pointer */
  163. }
  164.  
  165. tirev(state)            /* change reverse video state */
  166.  
  167. int state;        /* TRUE = reverse, FALSE = normal */
  168.  
  169.     /* Should not be accessed by memmap driver */
  170. }
  171.  
  172. ticres()         /* change screen resolution - not used    */
  173.             /* TI uses only 720 x 300 res text mode */
  174. {
  175.         return(TRUE);
  176. }
  177.  
  178. spal()          /* change palette string */
  179.  
  180. {
  181.         /*  Does nothing here - don't know what Dan plans are */
  182. }
  183.  
  184. tikopen()       
  185.  
  186. {
  187.         /* No need to change keyboard mode */
  188. }
  189.  
  190. tikclose()      
  191.  
  192. {
  193.         /* No need to close */
  194. }
  195.  
  196. tibeep()
  197. {
  198.         bdos(6, BEL, 0);
  199. }
  200.  
  201. tiopen()
  202. {
  203.     tieeop();        /* Make logical = physical screen pointers */ 
  204.     scinit();
  205.         strcpy(sres, "NORMAL");
  206.         revexist = TRUE;
  207.         ttopen();
  208. }
  209.  
  210. #if     FLABEL
  211. fnclabel (f, n)                 /* label a function key         */
  212.  
  213. int f,n;                        /* default flag, numeric argument [unused] */
  214.  
  215. {
  216.         /* Don't bother.  All function keys can be bound on the fly */
  217.         return(TRUE);
  218. }
  219. #endif
  220.  
  221. ticlose()
  222.  
  223. {
  224.         tifcol(7);
  225.         ttclose();
  226.  
  227. }
  228.  
  229. scinit()    /* initialize the screen head pointers */
  230.  
  231. {
  232.     union {
  233.         long laddr;    /* long form of address */
  234.         int *paddr;    /* pointer form of address */
  235.     } addr;
  236.  
  237.     char i;
  238.  
  239.     /* initialize the screen pointer array */
  240.     for (i = 0; i < NROW; i++) {
  241.         addr.laddr = scadd + (long)(NCOL * i);
  242.         scptr[i] = addr.paddr;
  243.     }
  244. }
  245.  
  246. scwrite(row, outstr, forg, bacg)    /* write a line out*/
  247.  
  248. int row;    /* row of screen to place outstr on */
  249. char *outstr;    /* string to write out (must be term.t_ncol long) */
  250. int forg;    /* forground color of string to write */
  251. int bacg;    /* background color */
  252.  
  253. {
  254.     char    *lnptr;    /* pointer to the destination line */
  255.     char    i;
  256.  
  257.     /* write the attribute byte to latch and setup the screen pointer */
  258.     if (forg == 0) {   /*Then you can change the back ground to color */
  259.         bacg = ctrans[bacg] + TI_REVERSE;
  260.         memset(attradd, bacg, 1);
  261.     }
  262.     else {
  263.         forg = ctrans[forg];
  264.         memset(attradd, forg, 1);
  265.     }
  266.  
  267.     lnptr = &sline[0];
  268.     for (i=0; i<term.t_ncol; i++)
  269.         *lnptr++ = outstr[i];
  270.     /* and send the string out */
  271.     movmem(&sline[0], scptr[row], term.t_ncol);
  272.  
  273. }
  274. #else
  275. tihello()
  276. {
  277. }
  278. #endif
  279.  
  280.